# 主要区别

def print_kwargs(**kwargs):
    print(kwargs)

# kwargs 是 “keyword arguments” 的缩写，
# 在 Python 函数定义中，**kwargs 用于收集所有未匹配的关键字参数，它将这些参数作为一个字典存储

print_kwargs(name="Alice", age=30, city="Beijing")
#
# 与 * args的区别
# *args用于收集所有未匹配的位置参数，它将这些参数作为一个元组存储、
# 而 ** kwargs收集的是关键字参数，以字典形式存储

def print_args_and_kwargs(*args, **kwargs):
    print("Args:", args)
    print("Kwargs:", kwargs)


print_args_and_kwargs(1, 2, 3, name="Bob", age=25)

# @property的介绍与使用
# 1.修饰方法，是方法可以像属性一样访问
class DataSet(object):
  @property
  def method_with_property(self): ##含有@property
      return 15

  @staticmethod
  def method_without_property(self): ##不含@property
      return 15

l = DataSet()
print(l.method_with_property) # 加了@property后，可以用调用属性的形式来调用方法,后面不需要加（）。
# print(l.method_without_property())  #没有加@property , 必须使用正常的调用方法的形式，即在后面加()
print(l.method_without_property(self="11")) #没有加@property , 必须使用正常的调用方法的形式，即在后面加()


# 2.与所定义的属性配合使用，这样可以防止属性被修改
class DataSet(object):
    def __init__(self):
        self._images = 1
        self._labels = 2 #定义属性的名称

    @property
    def images(self): #方法加入@property后，这个方法相当于一个属性，这个属性可以让用户进行使用，而且用户有没办法随意修改。
        return self._images
    @property
    def labels(self):
        return self._labels
l = DataSet()
#用户进行属性调用的时候，直接调用images即可，而不用知道属性名_images，因此用户无法更改属性，从而保护了类的属性。
print(l.images) # 加了@property后，可以用调用属性的形式来调用方法,后面不需要加（）


# 异常处理 使用__lt__
#
# class Rectangle:
#     def __init__(self, width, height):
#         self.width = width
#         self.height = height
#
#     def __lt__(self, other):
#
#         # isinstance()
#         # 是Python中的一个内置函数，用于检查一个对象是否是指定类或类型的实例。它的语法如下：
#         # isinstance(object, classinfo)复制其中，object是要检查的对象，classinfo
#         # 是要检查的类或类型，可以是类对象、类型对象或者由它们组成的元组。
#         # 如果object是classinfo的实例（或者是其子类的实例），则返回 True，否则返回False
#
#         if isinstance(other, Rectangle):
#             return self.width * self.height < other.width * other.height
#         return NotImplemented
#
#
# # 创建一个 Rectangle 对象和一个整数
# rectangle = Rectangle(3, 4)
# number = 10
#
# # 尝试比较不同类型的对象
# result = rectangle < number  # 不会引发异常
# print(result)  # 输出: NotImplemented

#今日知识点收获 静态方法有什么用？
# @property装饰器又有什么用？ isinstance是什么东西？有什么用？
# init初始化方法又是啥 ？
# kwargs和args有啥区别啊 ？
# 在实际写代码中怎么实现呢 ？
# __it__方法 魔术方法，内置的
# 下面的代码实现了什么功能呢
def tcp_get_name(self, *args,**kwargs):
    # self.name = None
    name = "one"
    print("name:",name)
    print("args:",args)
    print("kwargs:",kwargs)

    return name,args,kwargs

data = {
    "name": "one",
    "age": 30,
}
tcp_get_name("one","two","three",data=data)